package leetcode_ago.map_and_set;
/**
 * @author 美女
 * @date 2022/03/28 18:36
 **/

/**
 *给定一个段落 (paragraph)和一个禁用单词列表 (banned)。返回出现次数最多，同时不在禁用列表中的单词。
 * 题目保证至少有一个词不在禁用列表中，而且答案唯一。
 * 禁用列表中的单词用小写字母表示，不含标点符号。段落中的单词不区分大小写。答案都是小写字母
 */

import java.util.*;

/**
 * 分析
 * 1.大小写转换：先将段落中的单词都转换成小写字母形式
 * 2.Set集合存储禁用列表的单词；Map集合存储段落单词及出现频次
 * 3.统计每个不在禁用列表的单词出现频次，返回出现次数最多的单词
 */
public class Num819_MostCommomWord {
    public static String mostCommonWord(String paragraph, String[] banned) {
        //段落单词全部小写
        String par=paragraph.toLowerCase()+" ";
        //map集合存储单词及对应次数
        Map<String,Integer> map=new HashMap<>();
        Set<String> set=new HashSet<>();
        for (int i = 0; i < banned.length; i++) {
            //禁用单词先全部存入Set集合
            set.add(banned[i]);
        }
        //将字符串段落按一个个字母拆分，isLetter():是否是字母，将单词成为一个集合
        //遍历字符串段落
        int maxCount=0;
        String res="";
        StringBuilder word=new StringBuilder();
        for (char ch:par.toCharArray()) {
            if(Character.isLetter(ch)){
                //如果ch是字母，添加
                word.append(ch);
            }else if(word.length()>0){
                //此时碰到标点符号,word已经是一个单词了
                String s=word.toString();
                //判断此单词是否在Set集合中
                if(!set.contains(s)){
                    map.put(s,map.getOrDefault(s,0)+1);
                    if(maxCount<map.get(s)){
                        res=s;
                        maxCount=map.get(s);
                    }
                }
                //word给一个新空间继续存储单词
                word=new StringBuilder();
            }
        }
        return res;
    }
public static void main(String[] args) {
    String s= "Bob";
//    System.out.println(s);
   String[] a={""};
    String res=mostCommonWord(s,a);
//    String[] result=res.split(" ");
    System.out.println(res);
}
}
